package pe.com.bbva.pct.web.jsf;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;

import pe.com.bbva.pct.domain.Regla;
import pe.com.bbva.pct.dto.ReglaDTO;
import pe.com.bbva.pct.dto.ReglaFuenteDTO;
import pe.com.bbva.pct.dto.RelacionFuenteEntidadDTO;
import pe.com.bbva.pct.enumeracion.EnumTipoAccion;
import pe.com.bbva.pct.enumeracion.EnumTipoReglaFuente;
import pe.com.bbva.pct.service.AplicacionService;
import pe.com.bbva.pct.service.CoreMotorService;
import pe.com.bbva.pct.service.ReglaService;
import pe.com.bbva.pct.util.ConstantesGenerales;
import pe.com.bbva.pct.util.SelectLabel;
import pe.com.bbva.pct.util.SpringJSFUtil;
import pe.com.bbva.pct.util.TablaPaginador;
import pe.com.bbva.pct.vo.ReglaVO;

@ManagedBean(name = "reglaBean")
@ViewScoped
public class ReglaBean {

	private static final Logger log = Logger.getLogger(ReglaBean .class);
	private ReglaDTO reglaDTO;
	private ReglaVO reglaVO;
	private ReglaFuenteDTO reglaFuenteSalidaDTO;
	private LazyDataModel<ReglaDTO> listaRelglasDTO;
	private Long idReglaSeleccionada;
	private Long idReglaFuente;
	private Long idAplicacion;
	private String reglaService = "reglaService";
	private String strCabecera;
	private String tituloDialog;
	private String mensajeAlerta;
	private String strTitulo;
	private EnumTipoAccion tipoAccion;
	private EnumTipoReglaFuente tipoReglaFuente;
	private List<ReglaFuenteDTO> listaReglaFuenteDTO;
	private List<ReglaFuenteDTO> listaReglaFuenteEliminadosDTO;
	private List<SelectItem> listaFuentesDTO;
	private List<SelectItem> listaFuentesEntradaDTO;
	private List<SelectItem> listaFuentesSalidaDTO;
	private List<SelectLabel> listaEntidadesDTO;
	private List<SelectLabel> listaCamposEntidadesDTO;
	private List<RelacionFuenteEntidadDTO> listaRelacionFuenteEntidadDTO;
	private boolean bolRenderedTipoEjecucion;
	private boolean cbHabilitado;
	private boolean accionOk;
	private boolean bolMostrarCamposFuenteSalida;
	
	
	

	public CoreMotorService getCoreMotorService() {
		return coreMotorService;
	}

	public void setCoreMotorService(CoreMotorService coreMotorService) {
		this.coreMotorService = coreMotorService;
	}

	@ManagedProperty(value = "#{coreMotorService}")
	private CoreMotorService coreMotorService;
	
	public ReglaBean() {
		reglaDTO = new ReglaDTO();
		reglaVO = new ReglaVO();
		reglaFuenteSalidaDTO = new ReglaFuenteDTO();
		reglaFuenteSalidaDTO.setIdTipoFuente(ConstantesGenerales.TIPO_FUENTE_SALIDA);
		bolMostrarCamposFuenteSalida = true;
		FacesContext context = FacesContext.getCurrentInstance(); 
		HttpSession sesion = (HttpSession)context.getExternalContext().getSession(true);
		tipoAccion = (EnumTipoAccion) sesion.getAttribute("tipoAccion");
		idAplicacion = (Long) sesion.getAttribute("idAplicacionSesion");
		strCabecera = (String) sesion.getAttribute("codigoAplicacion") + " - " +
						(String) sesion.getAttribute("idNombreLargoAplicacion") + " ("+
						(String) sesion.getAttribute("idNombreAplicacion") +")";
		reglaVO.setIdAplicacion(idAplicacion);
		listaReglaFuenteDTO= new ArrayList<ReglaFuenteDTO>();
		try {
			listaCamposEntidadesDTO = new ArrayList<SelectLabel>();
			listaFuentesDTO = new ArrayList<SelectItem>() ;
			listaEntidadesDTO = new ArrayList<SelectLabel>();
			listaFuentesEntradaDTO= new ArrayList<SelectItem>() ;
			listaFuentesSalidaDTO= new ArrayList<SelectItem>() ;
			listaRelacionFuenteEntidadDTO= new ArrayList<RelacionFuenteEntidadDTO>();
			//listaFuentesDTO=getReglaService().obtenerListaFuentes();
			listaFuentesEntradaDTO=getReglaService().obtenerListaFuentes(Long.parseLong(ConstantesGenerales.TIPO_FUENTE_ENTRADA));
			listaFuentesSalidaDTO=getReglaService().obtenerListaFuentes(Long.parseLong(ConstantesGenerales.TIPO_FUENTE_SALIDA));
			listaEntidadesDTO=getReglaService().obtenerListaEntidades(idAplicacion);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(tipoAccion==EnumTipoAccion.Nuevo){
			idReglaSeleccionada=null;
			strTitulo="REGISTRAR NUEVA REGLA";
		}
		try {
			if(tipoAccion==EnumTipoAccion.Actualizar){
				strTitulo="MODIFICAR REGLA";
				listaReglaFuenteEliminadosDTO = new ArrayList<ReglaFuenteDTO>();
				idReglaSeleccionada = (Long) sesion.getAttribute("idReglaSeleccionadaSesion");
				if(idReglaSeleccionada!=null){
					reglaDTO=getReglaService().obtenerRegla(idReglaSeleccionada);
					reglaFuenteSalidaDTO=reglaDTO.getReglaFuenteSalida();
					listaReglaFuenteDTO=reglaDTO.getListaFuentesEntrada();
					if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_SINCRONA)){
						bolRenderedTipoEjecucion =false;
					}else if (reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_ASINCRONA)){
						bolRenderedTipoEjecucion =true;
						Long tipoFuente =getReglaService().obtenerTipoDeFuente(Long.parseLong(reglaDTO.getReglaFuenteSalida().getIdFuente()));
						if(tipoFuente.toString().equals(ConstantesGenerales.TIPO_FUENTE_XML)){
							bolMostrarCamposFuenteSalida = false;
							reglaFuenteSalidaDTO.setClaseEntidad(ConstantesGenerales.VALOR_SELECCIONE);
						}else{
							bolMostrarCamposFuenteSalida = true;
						}
					}
				}
			}
		} catch (Exception e) {
			log.info(e.getMessage());
			
		}
		
		
		
		
		buscar();
	}
	
	public void buscar(){
		try {
			int cantidad = getReglaService().cantidadTotalObjetos(reglaVO);
			listaRelglasDTO=new TablaPaginador<ReglaDTO>(reglaService,"buscarObjetosPaginados",reglaVO,cantidad);	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void eliminarFuenteRegla() {
		try {
			if(tipoAccion==EnumTipoAccion.Nuevo){
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					if(objDTO.getId().toString().equals(idReglaFuente.toString())){
						listaReglaFuenteDTO.remove(objDTO);
						break;
					}
				}
				Integer contador=1;
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					objDTO.setItem(contador);
					contador++;
				}
			}else if(tipoAccion==EnumTipoAccion.Actualizar){
					for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
						if(objDTO.getId().toString().equals(idReglaFuente.toString())){
							objDTO.setIdEstado(ConstantesGenerales.EST_ELIMINADO_VALOR_LISTADO.toString());
							for(RelacionFuenteEntidadDTO item : objDTO.getListaRelacionFuenteEntidad()){
								item.setIdEstado(ConstantesGenerales.EST_ELIMINADO_VALOR_LISTADO.toString());
							}
							listaReglaFuenteEliminadosDTO.add(objDTO);
							listaReglaFuenteDTO.remove(objDTO);
							break;
						}
					}
					Integer contador=1;
					for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
						objDTO.setItem(contador);
						contador++;
					}	
			}
		} catch (Exception e) {
			e.printStackTrace();
			}
		}
	
	public void limpiar() {
		try {
			reglaVO =  new ReglaVO();
			reglaVO.setIdAplicacion(idAplicacion);
			listaRelglasDTO=new TablaPaginador<ReglaDTO>(null,null,null,0);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public void eliminar() {
		try {
			getReglaService().eliminarRegla(idReglaSeleccionada);
			buscar();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void generarControles(){
		try {
			if(reglaDTO.getIdTipoEjecucion().equals(ConstantesGenerales.TIPO_SINCRONA)){
				bolRenderedTipoEjecucion=false;
			} else if(reglaDTO.getIdTipoEjecucion().equals(ConstantesGenerales.TIPO_ASINCRONA)){
				bolRenderedTipoEjecucion=true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	

	public String irAtras(){
		try {
			FacesContext context = FacesContext.getCurrentInstance(); 
			HttpSession sesion = (HttpSession)context.getExternalContext().getSession(true);
			sesion.setAttribute("idAplicacionSesion", idAplicacion);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/Administrador/AdministarAplicacion/AdministrarAplicaciones.xhtml";
	}
	
	public String cargarValores(int intAccion){
		try {
			FacesContext context = FacesContext.getCurrentInstance(); 
			HttpSession sesion = (HttpSession)context.getExternalContext().getSession(true);
			switch(intAccion){
				case 1:
					sesion.setAttribute("tipoAccion", EnumTipoAccion.Nuevo);
					sesion.setAttribute("idAplicacionSesion", idAplicacion);
					break;
				case 2:
					sesion.setAttribute("tipoAccion", EnumTipoAccion.Actualizar);
					sesion.setAttribute("idAplicacionSesion", idAplicacion);
					sesion.setAttribute("idReglaSeleccionadaSesion",idReglaSeleccionada);
				break;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/Administrador/AdministrarReglas/MantenimientoRegla.xhtml";
	}
	
	public void relacionarReglaFuenteEntrada() {
		try {
			tipoReglaFuente=EnumTipoReglaFuente.Entrada;
				if(!validarNuevaRelacion()){
					for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
						if(objDTO.getId().toString().equals(idReglaFuente.toString())){
							String strIdReglaFuente=null;
							for(ReglaFuenteDTO item:listaReglaFuenteDTO){
								if(item.getId().toString().equals(idReglaFuente.toString())){
									strIdReglaFuente=item.getIdReglaFuente();
									if(strIdReglaFuente!=null){
										//objDTO.setId(Integer.parseInt(strIdReglaFuente));
									}
								}
							}
					listaRelacionFuenteEntidadDTO= new ArrayList<RelacionFuenteEntidadDTO>();
					if(!objDTO.getIdFuente().toString().equals(ConstantesGenerales.VALOR_SELECCIONE) && !objDTO.getClaseEntidad().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)){
						if(objDTO.getListaRelacionFuenteEntidad().size()>0){		
							List<RelacionFuenteEntidadDTO> listaRelaciones = getReglaService().obtenerCamposFuenteNuevo(Long.parseLong(objDTO.getIdFuente()));
							List<RelacionFuenteEntidadDTO> listaRelaciones2 = new ArrayList<RelacionFuenteEntidadDTO>();	
							for(RelacionFuenteEntidadDTO relacionDto2:listaRelaciones){	
								boolean bolFind=false;
								for(RelacionFuenteEntidadDTO relacionDto:objDTO.getListaRelacionFuenteEntidad()){		
										if(relacionDto2.getIdCampoFuente().toString().equals(relacionDto.getIdCampoFuente())){
											bolFind=true;
											break;
										}
									}
									if(bolFind==false){
										listaRelaciones2.add(relacionDto2);
									}
								}
							objDTO.getListaRelacionFuenteEntidad().addAll(listaRelaciones2);
							listaRelacionFuenteEntidadDTO = objDTO.getListaRelacionFuenteEntidad();
						} else {
							listaRelacionFuenteEntidadDTO = getReglaService().obtenerCamposFuenteNuevo(Long.parseLong(objDTO.getIdFuente()));
						}
						listaCamposEntidadesDTO= getReglaService().listarCamposEntidad(objDTO.getClaseEntidad(),idAplicacion);
						accionOk=true;
						}
					}
				}
			}
			RequestContext context = RequestContext.getCurrentInstance();  
	        boolean loggedIn = false;
	        if(accionOk  == true){
	        	loggedIn=true;
	        	context.addCallbackParam("loggedIn", loggedIn);  
	        }else {
	        	loggedIn=false;
	        	context.addCallbackParam("loggedIn", loggedIn);  
	        }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public void guardarRelacionFuenteEntidad(){
		try {
			if(tipoAccion==EnumTipoAccion.Nuevo){
				if(!validarRelaciones()){
					if(tipoReglaFuente==EnumTipoReglaFuente.Entrada){			
						for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
							if(objDTO.getId().toString().equals(idReglaFuente.toString())){
								for(RelacionFuenteEntidadDTO relacionDTO: listaRelacionFuenteEntidadDTO){
									relacionDTO.setFueGuardado(true);
								}
								objDTO.setListaRelacionFuenteEntidad(listaRelacionFuenteEntidadDTO);
							}
						}
						accionOk=true;
						mensajeAlerta="Se guardo la relacion";
					}else if (tipoReglaFuente==EnumTipoReglaFuente.Salida){
						for(RelacionFuenteEntidadDTO relacionDTO: listaRelacionFuenteEntidadDTO){
							relacionDTO.setFueGuardado(true);
						}
						reglaFuenteSalidaDTO.setListaRelacionFuenteEntidad(listaRelacionFuenteEntidadDTO);
						accionOk=true;
						mensajeAlerta="Se guardo la relacion";
					}
				}
			}else if(tipoAccion==EnumTipoAccion.Actualizar){
				if(!validarRelaciones()){
					if(tipoReglaFuente==EnumTipoReglaFuente.Entrada){	
						String strIdReglaFuente=null;
						String strIdFuente=null;
						String strEntidad=null;
						for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
							if(objDTO.getId().toString().equals(idReglaFuente.toString())){
								strIdReglaFuente=objDTO.getIdReglaFuente();
								strIdFuente=objDTO.getIdFuente();
								strEntidad=objDTO.getClaseEntidad();
							}
						}
					if(strIdReglaFuente!=null){
						listaRelacionFuenteEntidadDTO = getReglaService().actualizarRelaciones(listaRelacionFuenteEntidadDTO, Long.parseLong(strIdReglaFuente),Long.parseLong(strIdFuente),strEntidad);
						accionOk=true;
						mensajeAlerta="Se guardo la relacion";
						for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
							if(objDTO.getIdReglaFuente().toString().equals(strIdReglaFuente)){
								objDTO.setListaRelacionFuenteEntidad(listaRelacionFuenteEntidadDTO);
							}
						}
					} else { for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
								if(objDTO.getId().toString().equals(idReglaFuente.toString())){
									for(RelacionFuenteEntidadDTO relacionDTO: listaRelacionFuenteEntidadDTO){
									 	relacionDTO.setFueGuardado(true);
								}
								objDTO.setListaRelacionFuenteEntidad(listaRelacionFuenteEntidadDTO);
								}
							}
							accionOk=true;
							mensajeAlerta="Se guardo la relacion";
							}
					}else if (tipoReglaFuente==EnumTipoReglaFuente.Salida){
							if(reglaFuenteSalidaDTO.getIdReglaFuente()!=null){	
								reglaFuenteSalidaDTO.setListaRelacionFuenteEntidad(getReglaService().actualizarRelaciones(listaRelacionFuenteEntidadDTO,Long.parseLong(reglaFuenteSalidaDTO.getIdReglaFuente()),Long.parseLong(reglaFuenteSalidaDTO.getIdFuente()),reglaFuenteSalidaDTO.getClaseEntidad()));
								accionOk=true;
								mensajeAlerta="Se guardo la relacion";
							}else { for(RelacionFuenteEntidadDTO relacionDTO: listaRelacionFuenteEntidadDTO){
										relacionDTO.setFueGuardado(true);
									}
									reglaFuenteSalidaDTO.setListaRelacionFuenteEntidad(listaRelacionFuenteEntidadDTO);
									accionOk=true;
									mensajeAlerta="Se guardo la relacion";
							}
						}
					}
				}
		} catch (Exception e) {
		e.printStackTrace();
		}
	}
	
	public void cancelarRelacionFuenteEntidad(){
		try {
			if(tipoAccion==EnumTipoAccion.Nuevo){
				if(tipoReglaFuente==EnumTipoReglaFuente.Entrada){			
					for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
						if(objDTO.getId().toString().equals(idReglaFuente.toString())){
							for(RelacionFuenteEntidadDTO relacionDTO: objDTO.getListaRelacionFuenteEntidad()){
								if(relacionDTO.isFueGuardado()==false){
									relacionDTO.setCampoEntidad(ConstantesGenerales.VALOR_SELECCIONE);
								}
							}
						}
					}
				}else if (tipoReglaFuente==EnumTipoReglaFuente.Salida){
					for(RelacionFuenteEntidadDTO relacionDTO: reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad()){
						if(relacionDTO.isFueGuardado()==false){
							relacionDTO.setCampoEntidad(ConstantesGenerales.VALOR_SELECCIONE);
						}
					}
				}	
			} else if(tipoAccion==EnumTipoAccion.Actualizar){
				if(tipoReglaFuente==EnumTipoReglaFuente.Entrada){			
					for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
						if(objDTO.getId().toString().equals(idReglaFuente.toString())){
							if(objDTO.getIdReglaFuente()!=null || !objDTO.getIdReglaFuente().equals(ConstantesGenerales.VALOR_VACIO)){
								objDTO.setListaRelacionFuenteEntidad(getReglaService().obtenerRelaciones(Long.parseLong(objDTO.getIdReglaFuente())));
							}
							for(RelacionFuenteEntidadDTO relacionDTO: objDTO.getListaRelacionFuenteEntidad()){
								if(relacionDTO.isFueGuardado()==false){
									relacionDTO.setCampoEntidad(ConstantesGenerales.VALOR_SELECCIONE);
								}
							}
						}
					}
				}else if (tipoReglaFuente==EnumTipoReglaFuente.Salida){
					for(RelacionFuenteEntidadDTO relacionDTO: reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad()){
						if(relacionDTO.getIdReglaFuente()!=null || !relacionDTO.getIdReglaFuente().equals(ConstantesGenerales.VALOR_VACIO)){
							reglaFuenteSalidaDTO.setListaRelacionFuenteEntidad(getReglaService().obtenerRelaciones(Long.parseLong(relacionDTO.getIdReglaFuente())));
						}
						
						if(relacionDTO.isFueGuardado()==false){
							relacionDTO.setCampoEntidad(ConstantesGenerales.VALOR_SELECCIONE);
						}
					}
				}	
				
				
			}
			
			
		} catch (Exception e) {
		e.printStackTrace();
		}
	}
	
	public boolean validarRelaciones(){
		boolean bolResultado=false;
		try {
			for(RelacionFuenteEntidadDTO relacionDTO: listaRelacionFuenteEntidadDTO){
				if(relacionDTO.getCampoEntidad().equals(ConstantesGenerales.VALOR_SELECCIONE)){
					accionOk=false;
					bolResultado=true;
					mensajeAlerta="Debe selecionar un campo de entidad para todos los campos de la fuente";
					return bolResultado;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bolResultado;
	}
	public void eliminarReglaFuenteEntrada(){
		try {
			if(tipoAccion==EnumTipoAccion.Nuevo){
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					if(objDTO.getId().toString().equals(idReglaFuente.toString())){
						listaReglaFuenteDTO.remove(objDTO);
						break;
					}
				}
				Integer contador=1;
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					objDTO.setItem(contador);
					contador++;
				}
			}else if(tipoAccion==EnumTipoAccion.Actualizar){
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					if(objDTO.getId().toString().equals(idReglaFuente.toString())){
						objDTO.setIdEstado(ConstantesGenerales.EST_ELIMINADO_VALOR_LISTADO.toString());
						for(RelacionFuenteEntidadDTO item : objDTO.getListaRelacionFuenteEntidad()){
							item.setIdEstado(ConstantesGenerales.EST_ELIMINADO_VALOR_LISTADO.toString());
						}
						listaReglaFuenteEliminadosDTO.add(objDTO);
						listaReglaFuenteDTO.remove(objDTO);
						break;
					}
				}
				Integer contador=1;
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					objDTO.setItem(contador);
					contador++;
				}		
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void agregarReglaFuente(){
		try {
			ReglaFuenteDTO reglaDTO = new ReglaFuenteDTO();
			listaReglaFuenteDTO.add(reglaDTO);
			Integer contador=1;
			for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
				objDTO.setItem(contador);
				objDTO.setId(contador);
				objDTO.setIdTipoFuente(ConstantesGenerales.TIPO_FUENTE_ENTRADA);
				contador++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void validarResultado(ActionEvent actionEvent){
		RequestContext context = RequestContext.getCurrentInstance();  
        boolean loggedIn = false;
        if(accionOk  == true){
        	loggedIn=true;
        	context.addCallbackParam("loggedIn", loggedIn);  
        }else {
        	loggedIn=false;
        	context.addCallbackParam("loggedIn", loggedIn);  
        }
	}
	
	public String validarSave(){
		
		 String ruta="";
        if(accionOk  == true){
        	ruta = "/Administrador/AdministrarReglas/AdministrarReglas.xhtml";  
        }else {
        	ruta="";
        	 RequestContext requestContext = RequestContext.getCurrentInstance();
			 requestContext.execute("dialogMensajeGrabar.hide()");
        }
        return ruta; 
	}
	
//	public String ocultarAlerta(){
//		 String ruta="";
//		 try {
//			 if (accionOk==true){
//				 
//			 }else{
//				
//				
//			 }
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		 return ruta;
//	 }
	
	public boolean validarNuevaRelacion(){
		boolean bolResultado=false;
		try {
			if(tipoReglaFuente==EnumTipoReglaFuente.Entrada){			
				for(ReglaFuenteDTO objDTO:listaReglaFuenteDTO){
					if(objDTO.getId().toString().equals(getIdReglaFuente().toString())){
						if(objDTO.getIdFuente().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)){
							accionOk=false;
							mensajeAlerta="Debe selecionar la fuente"; 
							bolResultado=true;
							return bolResultado;
						}else if (objDTO.getClaseEntidad().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)){
							accionOk=false;
							mensajeAlerta="Debe selecionar la entidad";
							bolResultado=true;
							return bolResultado;
						}else{
							accionOk=true;
							bolResultado=false;
							return bolResultado;
						}
					}
				}
			}else if (tipoReglaFuente==EnumTipoReglaFuente.Salida){
				if(reglaFuenteSalidaDTO.getIdFuente().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)){
					accionOk=false;
					mensajeAlerta="Debe selecionar la fuente";
					bolResultado=true;
					return bolResultado;
				}else if(reglaFuenteSalidaDTO.getClaseEntidad().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)){
					accionOk=false;
					mensajeAlerta="Debe selecionar la entidad";
					bolResultado=true;
					return bolResultado;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bolResultado;
	}
	
	public void relacionarReglaFuenteSalida(ActionEvent actionEvent){
		try {
			tipoReglaFuente=EnumTipoReglaFuente.Salida;
			if(!validarNuevaRelacion()){
				if(reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad().size()>0){
					listaRelacionFuenteEntidadDTO= new ArrayList<RelacionFuenteEntidadDTO>();
					List<RelacionFuenteEntidadDTO> listaRelaciones = getReglaService().obtenerCamposFuenteNuevo(Long.parseLong(reglaFuenteSalidaDTO.getIdFuente()));
					List<RelacionFuenteEntidadDTO> listaRelaciones2 = new ArrayList<RelacionFuenteEntidadDTO>();	
					for(RelacionFuenteEntidadDTO relacionDto2:listaRelaciones){	
						boolean bolFind=false;
						for(RelacionFuenteEntidadDTO relacionDto:reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad()){
							if(relacionDto2.getIdCampoFuente().toString().equals(relacionDto.getIdCampoFuente())){
								bolFind=true;
								break;
							}	
						}
						if(bolFind==false){
							listaRelaciones2.add(relacionDto2);
						}
					}
				reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad().addAll(listaRelaciones2);
				listaRelacionFuenteEntidadDTO = reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad();
				listaRelacionFuenteEntidadDTO = reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad();
				accionOk=true;
			}else{
				listaRelacionFuenteEntidadDTO= new ArrayList<RelacionFuenteEntidadDTO>();
				listaRelacionFuenteEntidadDTO= getReglaService().obtenerCamposFuenteNuevo(Long.parseLong(reglaFuenteSalidaDTO.getIdFuente()));
				accionOk=true;
			}
			
			listaCamposEntidadesDTO= getReglaService().listarCamposEntidad(reglaFuenteSalidaDTO.getClaseEntidad(),idAplicacion);
			}
			RequestContext context = RequestContext.getCurrentInstance();  
	        boolean loggedIn = false;
	        if(accionOk  == true){
	        	loggedIn=true;
	        	context.addCallbackParam("loggedIn", loggedIn);  
	        }else {
	        	loggedIn=false;
	        	context.addCallbackParam("loggedIn", loggedIn);  
	        }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
 public void grabarRegla(){
	 try {
		 
		 if(tipoAccion==EnumTipoAccion.Nuevo){
			 reglaDTO.setIdAplicacion(idAplicacion.toString());
			 reglaDTO.setListaFuentesEntrada(listaReglaFuenteDTO);
			 reglaFuenteSalidaDTO.setIdTipoFuente(ConstantesGenerales.TIPO_FUENTE_SALIDA);
			 reglaDTO.setReglaFuenteSalida(reglaFuenteSalidaDTO);
			 if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_SINCRONA)){
				 if(!validarGrabar(ConstantesGenerales.TIPO_SINCRONA)){
					getReglaService().insertarRegla(reglaDTO);
					accionOk=true;
					mensajeAlerta="Se inserto el registro";
				 } 
			 }else if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_ASINCRONA)){
				 if(!validarGrabar(ConstantesGenerales.TIPO_ASINCRONA)){
					 getReglaService().insertarRegla(reglaDTO);
					 accionOk=true;
					 mensajeAlerta="Se inserto el registro";
				 }
			 }else{
				 validarGrabar(ConstantesGenerales.TIPO_SINCRONA);
			 }
		 }else if(tipoAccion==EnumTipoAccion.Actualizar){
			 reglaDTO.setIdAplicacion(idAplicacion.toString());
			 listaReglaFuenteDTO.addAll(listaReglaFuenteEliminadosDTO);
			 reglaDTO.setListaFuentesEntrada(listaReglaFuenteDTO);
			 reglaFuenteSalidaDTO.setIdTipoFuente(ConstantesGenerales.TIPO_FUENTE_SALIDA);
			 reglaDTO.setReglaFuenteSalida(reglaFuenteSalidaDTO);
			 if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_SINCRONA)){
				 if(!validarGrabar(ConstantesGenerales.TIPO_SINCRONA)){
					getReglaService().actualizarRegla(reglaDTO);
					accionOk=true;
					mensajeAlerta="Se actualizo el registro";
				 } 
			 }else if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_ASINCRONA)){
				 if(!validarGrabar(ConstantesGenerales.TIPO_ASINCRONA)){
					 getReglaService().actualizarRegla(reglaDTO);
					 accionOk=true;
					mensajeAlerta="Se actualizo el registro";
				 }
			 }else{
				 validarGrabar(ConstantesGenerales.TIPO_SINCRONA);
			 }
		 }
	} catch (Exception e) {
		e.printStackTrace();
	}
 }
 
 public boolean validarGrabar(String inTipo){
	boolean bolResult=false;
	 try {
		 if(reglaDTO.getIdTipoEjecucion()!=null && reglaDTO.getIdTipoEjecucion().trim().equals(ConstantesGenerales.VALOR_SELECCIONE) ){
				accionOk=false;
				mensajeAlerta="Debe selecionar un tipo de ejecucion";
				bolResult=true;
				return bolResult;
			}
		 if(reglaDTO.getIdTipoEjecucion().toString().equals(ConstantesGenerales.TIPO_SINCRONA)){
			if(reglaDTO.getNombre()!=null && reglaDTO.getNombre().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
				accionOk=false;
				mensajeAlerta="Debe ingresar el nombre";
				bolResult=true;
				return bolResult;
			}
			if(reglaDTO.getNombreGuvnor()!=null && reglaDTO.getNombreGuvnor().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
				accionOk=false;
				mensajeAlerta="Debe ingresar el nombre Guvnor";
				bolResult=true;
				return bolResult;
			}
			if(reglaDTO.getDescripcion()!=null && reglaDTO.getDescripcion().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
				accionOk=false;
				mensajeAlerta="Debe ingresar la descripcion";
				bolResult=true;
				return bolResult;
			}
		 }else if(inTipo.toString().equals(ConstantesGenerales.TIPO_ASINCRONA)){
			 if(reglaDTO.getNombre()!=null && reglaDTO.getNombre().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
					accionOk=false;
					mensajeAlerta="Debe ingresar el nombre";
					bolResult=true;
					return bolResult;
				}
				if(reglaDTO.getNombreGuvnor()!=null && reglaDTO.getNombreGuvnor().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
					accionOk=false;
					mensajeAlerta="Debe ingresar el nombre Guvnor";
					bolResult=true;
					return bolResult;
				}
				if(reglaDTO.getDescripcion()!=null && reglaDTO.getDescripcion().trim().equals(ConstantesGenerales.VALOR_VACIO) ){
					accionOk=false;
					mensajeAlerta="Debe ingresar la descripcion";
					bolResult=true;
					return bolResult;
				}
				if(reglaDTO.getListaFuentesEntrada().size()==0){
					accionOk=false;
					mensajeAlerta="Debe tener al menos una fuente de entrada";
					bolResult=true;
					return bolResult;
				}
				if(reglaDTO.getListaFuentesEntrada().size()>0){
					for(ReglaFuenteDTO reglaFuente: reglaDTO.getListaFuentesEntrada()){
						
						if((reglaFuente.getIdFuente().toString().equals(ConstantesGenerales.VALOR_SELECCIONE)) || (reglaFuente.getClaseEntidad().toString().equals(ConstantesGenerales.VALOR_SELECCIONE))){
							accionOk=false;
							mensajeAlerta="la fuente Nro: "+reglaFuente.getItem() + " debe tener una fuente y una entidad";
							bolResult=true;
							return bolResult;
						}
						if(reglaFuente.getListaRelacionFuenteEntidad().size()==0){
							accionOk=false;
							mensajeAlerta="la fuente Nro: "+reglaFuente.getItem() + " No ha sido relacionada con al entidad";
							bolResult=true;
							return bolResult;
						}
					}
					if((reglaFuenteSalidaDTO.getIdFuente().toString().equals(ConstantesGenerales.VALOR_SELECCIONE))){
						accionOk=false;
						mensajeAlerta="la regla debe tener una fuente de salida";
						bolResult=true;
						return bolResult;
					}
					
					if(bolMostrarCamposFuenteSalida==true){
						if((reglaFuenteSalidaDTO.getClaseEntidad().toString().equals(ConstantesGenerales.VALOR_SELECCIONE))){
							accionOk=false;
							mensajeAlerta="la regla debe tener una entidad de salida";
							bolResult=true;
							return bolResult;
						}
					}
					
					if(bolMostrarCamposFuenteSalida==true){
						if(reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad().size()==0){
							accionOk=false;
							mensajeAlerta="la fuente de salida no ha sido relacionada con al entidad";
							bolResult=true;
							return bolResult;
						}
					}
				}
		 }
	} catch (Exception e) {
		e.printStackTrace();
	}
	 return bolResult;
 }
 
 
 public void recargarRelaciones(Integer id){
	 try {
		for(ReglaFuenteDTO reglaFuenteDTO: listaReglaFuenteDTO){
			if(reglaFuenteDTO.getId().toString().equals(id.toString())){
				reglaFuenteDTO.getListaRelacionFuenteEntidad().clear();
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
 }
 
 public void recargarRelacionesSalida(){
	 try {
		reglaFuenteSalidaDTO.getListaRelacionFuenteEntidad().clear();
		reglaFuenteSalidaDTO.getIdFuente();
		if(reglaFuenteSalidaDTO.getIdFuente()!=null && !reglaFuenteSalidaDTO.getIdFuente().equals(ConstantesGenerales.VALOR_SELECCIONE)){
			Long tipoFuenteSalida = getReglaService().obtenerTipoDeFuente(Long.parseLong(reglaFuenteSalidaDTO.getIdFuente()));
			if(tipoFuenteSalida.toString().equals(ConstantesGenerales.TIPO_FUENTE_XML)){
				bolMostrarCamposFuenteSalida = false;
				reglaFuenteSalidaDTO.setClaseEntidad(ConstantesGenerales.VALOR_SELECCIONE);
			}else{
				bolMostrarCamposFuenteSalida = true;
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
 }
 
 public void ejecutarTest(){
	 try {
		Regla regla = getReglaService().obtenerReglaPojo(idReglaSeleccionada);
		List<Object> listaObjetosGenericos = getCoreMotorService().cargarFuentes(regla);
	} catch (Exception e) {
		e.printStackTrace();
	}
 }
 
 public String irAdministrarReglas(){
	 try {
		 
	} catch (Exception e) {
		e.printStackTrace();
	}
	 return "/Administrador/AdministrarReglas/AdministrarReglas.xhtml";
 }
	
 
 public String ocultarAlerta(){
	 String ruta="";
	 try {
		 if (accionOk==true){
			 ruta = "/Administrador/AdministrarReglas/AdministrarReglas.xhtml";
		 }else{
			 RequestContext requestContext = RequestContext.getCurrentInstance();
			 requestContext.execute("dialogMensajeGrabar.hide()");
			
		 }
	} catch (Exception e) {
		e.printStackTrace();
	}
	 return ruta;
 }
 
	public ReglaService getReglaService() {
		return SpringJSFUtil.getBean(reglaService);
	}
	public boolean isBolRenderedTipoEjecucion() {
		return bolRenderedTipoEjecucion;
	}
	public void setBolRenderedTipoEjecucion(boolean bolRenderedTipoEjecucion) {
		this.bolRenderedTipoEjecucion = bolRenderedTipoEjecucion;
	}
	public LazyDataModel<ReglaDTO> getListaRelglasDTO() {
		return listaRelglasDTO;
	}
	public void setListaRelglasDTO(LazyDataModel<ReglaDTO> listaRelglasDTO) {
		this.listaRelglasDTO = listaRelglasDTO;
	}
	public Long getIdReglaSeleccionada() {
		return idReglaSeleccionada;
	}
	public void setIdReglaSeleccionada(Long idReglaSeleccionada) {
		this.idReglaSeleccionada = idReglaSeleccionada;
	}
	public String getTituloDialog() {
		return tituloDialog;
	}
	public void setTituloDialog(String tituloDialog) {
		this.tituloDialog = tituloDialog;
	}
	public EnumTipoAccion getTipoAccion() {
		return tipoAccion;
	}
	public void setTipoAccion(EnumTipoAccion tipoAccion) {
		this.tipoAccion = tipoAccion;
	}
	public boolean isCbHabilitado() {
		return cbHabilitado;
	}
	public void setCbHabilitado(boolean cbHabilitado) {
		this.cbHabilitado = cbHabilitado;
	}
	public String getMensajeAlerta() {
		return mensajeAlerta;
	}
	public void setMensajeAlerta(String mensajeAlerta) {
		this.mensajeAlerta = mensajeAlerta;
	}
	public boolean isAccionOk() {
		return accionOk;
	}
	public void setAccionOk(boolean accionOk) {
		this.accionOk = accionOk;
	}
	public ReglaDTO getReglaDTO() {
		return reglaDTO;
	}
	public void setReglaDTO(ReglaDTO reglaDTO) {
		this.reglaDTO = reglaDTO;
	}
	public ReglaVO getReglaVO() {
		return reglaVO;
	}
	public void setReglaVO(ReglaVO reglaVO) {
		this.reglaVO = reglaVO;
	}
	public Long getIdAplicacion() {
		return idAplicacion;
	}
	public void setIdAplicacion(Long idAplicacion) {
		this.idAplicacion = idAplicacion;
	}
	public String getStrCabecera() {
		return strCabecera;
	}
	public void setStrCabecera(String strCabecera) {
		this.strCabecera = strCabecera;
	}
	public ReglaFuenteDTO getReglaFuenteSalidaDTO() {
		return reglaFuenteSalidaDTO;
	}
	public void setReglaFuenteSalidaDTO(ReglaFuenteDTO reglaFuenteSalidaDTO) {
		this.reglaFuenteSalidaDTO = reglaFuenteSalidaDTO;
	}
	public List<ReglaFuenteDTO> getListaReglaFuenteDTO() {
		return listaReglaFuenteDTO;
	}
	public void setListaReglaFuenteDTO(List<ReglaFuenteDTO> listaReglaFuenteDTO) {
		this.listaReglaFuenteDTO = listaReglaFuenteDTO;
	}
	public List<SelectItem> getListaFuentesDTO() {
		return listaFuentesDTO;
	}
	public void setListaFuentesDTO(List<SelectItem> listaFuentesDTO) {
		this.listaFuentesDTO = listaFuentesDTO;
	}
	public List<SelectLabel> getListaEntidadesDTO() {
		return listaEntidadesDTO;
	}
	public void setListaEntidadesDTO(List<SelectLabel> listaEntidadesDTO) {
		this.listaEntidadesDTO = listaEntidadesDTO;
	}
	public Long getIdReglaFuente() {
		return idReglaFuente;
	}
	public void setIdReglaFuente(Long idReglaFuente) {
		this.idReglaFuente = idReglaFuente;
	}
	public List<RelacionFuenteEntidadDTO> getListaRelacionFuenteEntidadDTO() {
		return listaRelacionFuenteEntidadDTO;
	}
	public void setListaRelacionFuenteEntidadDTO(
			List<RelacionFuenteEntidadDTO> listaRelacionFuenteEntidadDTO) {
		this.listaRelacionFuenteEntidadDTO = listaRelacionFuenteEntidadDTO;
	}
	public List<SelectLabel> getListaCamposEntidadesDTO() {
		return listaCamposEntidadesDTO;
	}
	public void setListaCamposEntidadesDTO(List<SelectLabel> listaCamposEntidadesDTO) {
		this.listaCamposEntidadesDTO = listaCamposEntidadesDTO;
	}
	public EnumTipoReglaFuente getTipoReglaFuente() {
		return tipoReglaFuente;
	}
	public void setTipoReglaFuente(EnumTipoReglaFuente tipoReglaFuente) {
		this.tipoReglaFuente = tipoReglaFuente;
	}
	public void setReglaService(String reglaService) {
		this.reglaService = reglaService;
	}

	public String getStrTitulo() {
		return strTitulo;
	}

	public void setStrTitulo(String strTitulo) {
		this.strTitulo = strTitulo;
	}

	public List<ReglaFuenteDTO> getListaReglaFuenteEliminadosDTO() {
		return listaReglaFuenteEliminadosDTO;
	}

	public void setListaReglaFuenteEliminadosDTO(
			List<ReglaFuenteDTO> listaReglaFuenteEliminadosDTO) {
		this.listaReglaFuenteEliminadosDTO = listaReglaFuenteEliminadosDTO;
	}

	public List<SelectItem> getListaFuentesEntradaDTO() {
		return listaFuentesEntradaDTO;
	}

	public void setListaFuentesEntradaDTO(List<SelectItem> listaFuentesEntradaDTO) {
		this.listaFuentesEntradaDTO = listaFuentesEntradaDTO;
	}

	public List<SelectItem> getListaFuentesSalidaDTO() {
		return listaFuentesSalidaDTO;
	}

	public void setListaFuentesSalidaDTO(List<SelectItem> listaFuentesSalidaDTO) {
		this.listaFuentesSalidaDTO = listaFuentesSalidaDTO;
	}

	public boolean isBolMostrarCamposFuenteSalida() {
		return bolMostrarCamposFuenteSalida;
	}

	public void setBolMostrarCamposFuenteSalida(boolean bolMostrarCamposFuenteSalida) {
		this.bolMostrarCamposFuenteSalida = bolMostrarCamposFuenteSalida;
	}
	
}
